/*
 * Device Tree Source for Netgear WNDR4700/WNDR4720 Series
 *
 * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without
 * any warranty of any kind, whether express or implied.
 */

/dts-v1/;

#include "apm82181.dtsi"
#include <dt-bindings/thermal/thermal.h>

/ {
	model = "Netgear WNDR4700/WNDR4720 Series";
	compatible = "netgear,wndr4700";

	aliases {
		serial0 = &UART0;
		led-boot = &status;
		led-failsafe = &failsafe;
		led-running = &status;
		led-upgrade = &status;
	};

	chosen {
		linux,stdout-path = "/plb/opb/serial@ef600300";
	};

	thermal-zones {
		cpu_thermal: cpu-thermal {
			polling-delay-passive = <10000>; /* milliseconds */
			polling-delay = <20000>; /* milliseconds */

			thermal-sensors = <&temp0 1>;

			trips {
				/*
				 * Once the thermal governers are a bit smarter
				 * and do hysteresis properly, we can disable
				 * the fan when the HDD and CPU has < 39 C.
				 */
				cpu_alert0: cpu-alert0 {
					temperature = <25000>;
					hysteresis = <2000>;
					type = "active";
				};

				cpu_alert1: cpu-alert1 {
					temperature = <27000>; /* millicelsius */
					hysteresis = <2000>; /* millicelsius */
					type = "active";
				};

				cpu_alert2: cpu-alert2 {
					temperature = <65000>; /* millicelsius */
					hysteresis = <2000>; /* millicelsius */
					type = "active";
				};

				cpu_alert3: cpu-alert3 {
					temperature = <70000>; /* millicelsius */
					hysteresis = <2000>; /* millicelsius */
					type = "active";
				};

				cpu_alert4: cpu-alert4 {
					temperature = <75000>; /* millicelsius */
					hysteresis = <2000>; /* millicelsius */
					type = "active";
				};

				cpu_alert5: cpu-alert5 {
					temperature = <80000>; /* millicelsius */
					hysteresis = <2000>; /* millicelsius */
					type = "active";
				};

				cpu_alert6: cpu-alert6 {
					temperature = <850000>; /* millicelsius */
					hysteresis = <2000>; /* millicelsius */
					type = "active";
				};

				cpu_crit: cpu-crit {
					temperature = <90000>; /* millicelsius */
					hysteresis = <2000>; /* millicelsius */
					type = "critical";
				};
			};

			cooling-maps {
				map0 {
					trip = <&cpu_alert0>;
					cooling-device = <&fan0 THERMAL_NO_LIMIT 0>;
				};

				map1 {
					trip = <&cpu_alert1>;
					cooling-device = <&fan0 1 76>;
				};

				map2 {
					trip = <&cpu_alert2>;
					cooling-device = <&fan0 77 101>;
				};

				map3 {
					trip = <&cpu_alert3>;
					cooling-device = <&fan0 102 147>;
				};

				map4 {
					trip = <&cpu_alert4>;
					cooling-device = <&fan0 148 207>;
				};

				map5 {
					trip = <&cpu_alert5>;
					cooling-device = <&fan0 208 231>;
				};

				map6 {
					trip = <&cpu_alert6>;
					cooling-device =<&fan0 232 THERMAL_NO_LIMIT>;
				};
			};
		};
	};
};

&CRYPTO {
	status = "okay";
};

&PKA {
	status = "okay";
};

&TRNG {
	status = "okay";
};

&SATA1 {
	status = "okay";
};

&USBOTG0 {
	status = "okay";
	dr_mode = "host";
};

&EBC0 {
	ndfc@1,0 {
		status = "okay";
		/* 128 MiB Nand Flash */
		nand {
			#address-cells = <1>;
			#size-cells = <1>;

			partition0,0@0 {
				label = "NAND 128MiB 3,3V 8-bit";
				reg = <0x00000000 0x08000000>;
				read-only;
			};

			partition0,1@0 {
				label = "uboot";
				reg = <0x00000000 0x00180000>;
				read-only;
			};

			partition0,2@180000 {
				label = "device-tree";
				reg = <0x00180000 0x00020000>;
			};

			partition0,3@180000 {
				label = "kernel";
				reg = <0x00180000 0x00380000>;
				/*
				 * device-tree is @ 0x00180000 - 0x001fffff
				 * kernel starts from 0x200000.
				 * this is coded into netgear's u-boot.
				 *
				 * this partition will also contain a
				 * fake/empty rootfs at the end to fool
				 * Netgear's uboot rootfs integrety checks.
				 */
			};

			partition0,4@500000 {
				label = "ubi";
				reg = <0x00500000 0x014e0000>;
			};

			partition0,5@19e0000 {
				label = "config";
				reg = <0x019e0000 0x00080000>;
				read-only;
			};

			partition0,6@1a60000 {
				label = "pot";
				reg = <0x01a60000 0x00080000>;
				read-only;
			};

			partition0,7@1ae0000 {
				label = "traffic_meter";
				reg = <0x01ae0000 0x00300000>;
				read-only;
			};

			partition0,8@1de0000 {
				label = "language";
				reg = <0x01de0000 0x001c0000>;
				read-only;
			};

			partition0,9@1fa0000 {
				label = "ecos";
				reg = <0x01fa0000 0x06020000>;
				read-only;
			};

			partition0,10@7fc0000 {
				label = "wifi_data";
				reg = <0x07fc0000 0x00040000>;
				read-only;
			};

			partition0,11@180000 {
				label = "firmware";
				reg = <0x00180000 0x01860000>;
				read-only;
			};
		};
	};
};

&UART0 {
	status = "okay";
};

&GPIO0 {
	status = "okay";
	#interrupt-cells = <2>;
	interrupt-controller;
	interrupts-extended = <&UIC1 0x14>,
			      <&UIC1 0x1e>,
			      <&UIC1 0x1f>,
			      <&UIC2 0x19>;
};

&IIC0 {
	status = "okay";

	fan0: fan@1b {
		compatible = "microchip,tc654";
		reg = <0x1b>;
		cooling-min-level = <0>;
		cooling-max-level = <255>;
		#cooling-cells = <2>; /* min followed by max */

		gpios = <&GPIO0 16 GPIO_ACTIVE_LOW>; /* fan status */
		alarm-gpios = <&GPIO0 5 GPIO_ACTIVE_LOW>; /* fault */
		interrupt-parent = <&UIC3>;
		interrupts = <0x16 IRQ_TYPE_EDGE_FALLING>; /* fault */
	};

	temp0: temp@4d {
		compatible = "gmt,g781";
		reg = <0x4d>;
		#thermal-sensor-cells = <1>;

		/*
		 * The LM90 has two sensors:
		 *   temp0 -> internal to LM90
		 *   temp1 -> external NTC near CPU
		 */
	};
};


&EMAC0 {
	status = "okay";
	phy-handle = <&phy0>;

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;
		phy0: ethernet-phy@0 {
			device_type = "ethernet-phy";
			reg = <0>;
			qca,ar8327-initvals = <
				0x0010 0x40000000
				0x0624 0x007f7f7f
				0x0004 0x07a00000	/* PAD0_MODE */
				0x000c 0x01000000	/* PAD6_MODE */
				0x007c 0x0000007e	/* PORT0_STATUS */
			>;
		};
	};
};

&POB0 {
	gpio_keys_polled {
		compatible = "gpio-keys-polled";
		#address-cells = <1>;
		#size-cells = <0>;
		#interrupt-cells = <2>;
		autorepeat;
		poll-interval = <60>;   /* 3 * 20 = 60ms */

		reset {
			label = "Reset button";
			linux,code = <KEY_RESTART>;
			gpios = <&GPIO0 15 GPIO_ACTIVE_HIGH>;
			interrupt-parent = <&UIC1>;
			interrupts = <0x14 IRQ_TYPE_EDGE_FALLING>;
		};

		backup_hd {
			label = "Backup HD button";
			gpios = <&GPIO0 19 GPIO_ACTIVE_HIGH>;
			linux,code = <BTN_0>;
			interrupt-parent = <&UIC1>;
			interrupts = <0x1e IRQ_TYPE_EDGE_FALLING>;
		};

		rfkill {
			label = "RFKILL button";
			gpios = <&GPIO0 20 GPIO_ACTIVE_HIGH>;
			linux,code = <KEY_RFKILL>;
			interrupt-parent = <&UIC1>;
			interrupts = <0x1f IRQ_TYPE_EDGE_FALLING>;
		};

		wps {
			label = "WPS button";
			gpios = <&GPIO0 23 GPIO_ACTIVE_HIGH>;
			linux,code = <KEY_WPS_BUTTON>;
			interrupt-parent = <&UIC2>;
			interrupts = <0x19 IRQ_TYPE_EDGE_FALLING>;
		};

		sdcard {
			label = "SDCard inserted";
			gpios = <&GPIO0 7 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_1>;
		};
	};

	gpio-leds {
		compatible = "gpio-leds";
		status: power-green {
			label = "wndr4700:green:power";
			gpios = <&GPIO0 8 GPIO_ACTIVE_HIGH>;
		};

		failsafe: power-orange {
			label = "wndr4700:orange:power";
			gpios = <&GPIO0 9 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "panic";
		};

		usb-blue {
			label = "wndr4700:blue:usb";
			gpios = <&GPIO0 10 GPIO_ACTIVE_HIGH>;
		};

		logo-white {
			label = "wndr4700:white:logo";
			gpios = <&GPIO0 11 GPIO_ACTIVE_HIGH>;
		};

		wan-yellow {
			label = "wndr4700:yellow:wan";
			gpios = <&GPIO0 3 GPIO_ACTIVE_HIGH>;
		};

		wan-green {
			label = "wndr4700:green:wan";
			gpios = <&GPIO0 12 GPIO_ACTIVE_HIGH>;
		};

		hd-green {
			label = "wndr4700:green:hd";
			gpios = <&GPIO0 14 GPIO_ACTIVE_HIGH>;
		};

		hd-red {
			label = "wndr4700:red:hd";
			gpios = <&GPIO0 17 GPIO_ACTIVE_HIGH>;
		};

		wlan-blue {
			label = "wndr4700:blue:wlan";
			gpios = <&GPIO0 18 GPIO_ACTIVE_HIGH>;
		};
	};
};

&PCIE0 {
	status = "okay";
};

&MSI {
	status = "okay";
};
